//js实现重试机制，等待次数和等待时间
/**
 * 带有重试机制和超时控制的异步函数执行器
 * @param {Function} promiseFn - 返回Promise的函数，需要被重试执行
 * @param {number} maxRetries - 最大重试次数，默认为3次
 * @param {number} delay - 重试间隔时间(毫秒)，默认为1000ms
 * @param {number} timeout - 每次执行的超时时间(毫秒)，默认为3000ms
 * @returns {Promise} 返回promiseFn执行成功的结果
 * @throws {Error} 当所有重试都失败时，抛出最后一次的错误
 */
async function retryWithTimeout(promiseFn, maxRetries = 3, delay = 1000, timeout = 3000) {
    let lastError;

    // 循环执行重试逻辑
    for (let i = 0; i < maxRetries; i++) {
        try {
            // 使用 Promise.race 实现超时控制
            return await Promise.race([
                promiseFn(),
                new Promise((_, reject) =>
                    setTimeout(() => reject(new Error("Timeout")), timeout)
                )
            ]);
        } catch (err) {
            lastError = err;
            // 如果不是最后一次重试，则等待指定延迟后继续重试
            if (i < maxRetries - 1) {
                await new Promise(resolve => setTimeout(resolve, delay));
            }
        }
    }

    // 所有重试都失败，抛出最后一个错误
    throw lastError;
}
